package cn.mccraft.uide.api.property;

import java.util.Optional;
import java.util.Set;

import cn.mccraft.uide.api.property.key.Key;
import cn.mccraft.uide.api.property.value.Value;

public interface PropertyHolder {

	Set<Key<?>> getKeys();

	<V extends Value<?>> Optional<V> getValue(Key<V> key);

	default <E, V extends Value<E>> Optional<E> get(Key<V> key) {
		Optional<V> value = getValue(key);
		return value.isPresent() ? value.get().getDirect() : Optional.empty();
	}
	
	default <E, V extends Value<E>> E getOrNull(Key<V> key) {
		Optional<V> value = getValue(key);
		return value.isPresent() ? value.get().getValue() : null;
	}
	
	default <E, V extends Value<E>> E getOrDefault(Key<V> key, E defaultValue) {
		return get(key).orElse(defaultValue);
	}
	
	default <E, V extends Value<E>> void set(Key<V> key, E value) {
		getValue(key).get().setValue(value); //FIXME
	}

	<V extends Value<?>> void put(Key<V> key, V value);

	void remove(Key<?> key);

	boolean contains(Key<?> key);
}
